/**
 * 
 */
package mm.front.jsf.mb;

import java.io.Serializable;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

import mm.back.entity.Rubro;
import mm.back.filtros.RubrosFiltro;
import mm.back.service.ProductoService;
import mm.back.service.RubroService;
import mm.exceptions.MMGenericException;
import mm.front.jsf.ConstantesOutcome;
import mm.front.jsf.JSFUtils;

/**
 * @author PUSDERKIS
 *
 */
public class RubroManagedBean implements Serializable {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = -5921504736185538884L;
	
	private transient RubroService rubroService;
	
	private RubrosFiltro rubroFiltro;
	private boolean createOk;
	private boolean isModificacion;
	private Long rubroToDelete;	


	private Rubro rubro;
	
	/**
	 * @param rubroService the rubroService to set
	 */
	public void setRubroService(RubroService rubroService) {
		this.rubroService = rubroService;
	}

	
	public boolean isCreateOk() {
		return createOk;
	}

	public void setCreateOk(boolean createOk) {
		this.createOk = createOk;
	}
	
	public String crearRubro(){
		try{
			rubro = rubroService.createRubro(rubro.getNombre());	
			FacesMessage fm = new FacesMessage("Se creo con exito el rubro con ID: "+rubro.getId());
			fm.setSeverity(FacesMessage.SEVERITY_INFO);
			FacesContext.getCurrentInstance().addMessage(null, fm);
			rubro = new Rubro();
		} catch (MMGenericException e) {
			FacesMessage fm = new FacesMessage(e.getMessage());
			FacesContext.getCurrentInstance().addMessage(null, fm);
		}
		
		return ConstantesOutcome.RUBRO_LISTADO;
	}
	
	public String altaRubroInit(){
		return ConstantesOutcome.RUBRO_ALTA;
	}
	
	public String listadoRubro(){
		return ConstantesOutcome.RUBRO_LISTADO;
	}
	
	/*public String listadoRubroInit(){
		return ConstantesOutcome.RUBRO_LISTADO;
	}*/

	/**
	 * Busca los rubros activos.
	 * @return la lista de rubros activos.
	 */
	public List<Rubro> getRubrosActivos(){
		RubrosFiltro rf = new RubrosFiltro();
		rf.setActivo(Boolean.TRUE);
		return rubroService.searchRubros(rf);
	}
	
	/**
	 * 
	 * @return los rubros filtrados
	 */
	public List<Rubro> getRubros(){
		return rubroService.searchRubros(getRubroFiltro());
	}
	

	/**
	 * @return the rubro
	 */
	public Rubro getRubro() {
		return rubro;
	}
	
	public void borrarRubro(){
		
		if (rubroToDelete != null && rubroToDelete != 0){
			rubroService.deleteRubro(rubroToDelete);
			JSFUtils.addInfoMessage("Se desactivo el rubro " + rubroToDelete + " y todos los productos asociados con exito.");
		}
	}
	

	/**
	 * @param rubro the rubro to set
	 */
	public void setRubro(Rubro rubro) {
		this.rubro = rubro;
	}
	
	public String filtroActivo(){
		try{
			rubroService.filtrarActivo(rubro.getActivo());
		} catch (MMGenericException e) {
			FacesMessage fm = new FacesMessage (e.getMessage());
			FacesContext.getCurrentInstance().addMessage(null, fm);
		}
		return null;
	}
	
	public String filtroNombre(){
		try{
			rubroService.filtrarNombre(rubro.getNombre());
		} catch (MMGenericException e) {
			FacesMessage fm = new FacesMessage (e.getMessage());
			FacesContext.getCurrentInstance().addMessage(null, fm);
		}
		return null;
	}
	
	public void resetFilter() {
						
	}
	
	public void refresh(){}
	
	public Long getRubroToDelete() {
		return rubroToDelete;
	}
	
	/**
	 * @return the rubroFiltro
	 */
	public RubrosFiltro getRubroFiltro() {
		if (rubroFiltro == null){
			rubroFiltro = new RubrosFiltro();
			rubroFiltro.setActivo(Boolean.TRUE);
		}
		return rubroFiltro;
	}

	/**
	 * @param rubroFiltro the rubroFiltro to set
	 */
	public void setRubroFiltro(RubrosFiltro rubroFiltro) {
		this.rubroFiltro = rubroFiltro;
	}
	
	
	public boolean isModificacion() {
		return isModificacion;
	}
	public void setModificacion(boolean isModificacion) {
		this.isModificacion = isModificacion;
	}
	
	public String modificarRubro(){
		isModificacion = true;
		guardarRubro();
		JSFUtils.addInfoMessage("El rubro se modificó con exito");
		return ConstantesOutcome.RUBRO_LISTADO;
	}
	public String modificarRubroInit(){
		isModificacion = false;
		rubro = rubroService.getRubro(rubro.getId());
		return ConstantesOutcome.RUBRO_MODIFICAR;
	}
	
	
	public String guardarRubro(){
		getRubro().setNombre(rubro.getNombre());
		getRubro().setActivo(true);
		rubroService.saveRubro(getRubro());
		
		setCreateOk(true);
		
		return null;
	}
	

	public void setRubroToDelete(Long rubroToDelete) {
		this.rubroToDelete = rubroToDelete;
	}
	
}
